<html>
    <head>
        <title>创建数据库上下文 DbContext</title>
    </head>
    <body>
        <script>
            /*
                    二、创建数据库上下文  Creating  DbContext


                            1、如何创建DbContext类

                                    你的DbContext类应该派生自AbpDbContext<T>，如下所示：

                                                using Microsoft.EntityFrameworkCore;
                                                using Volo.Abp.EntityFrameworkCore;

                                                namespace MyCompany.MyProject
                                                {
                                                    public class MyDbContext : AbpDbContext<MyDbContext>
                                                    {
                                                        //...your DbSet properties here

                                                        public MyDbContext(DbContextOptions<MyDbContext> options)
                                                            : base(options)
                                                        {
                                                        }
                                                    }
                                                }

                            2、关于EF Core Fluent API 映射

                                    应用程序启动模板已配置为使用EF Core Fluent 配置API将你的实体映射到你的数据库表。

                                    你仍然可以对实体的属性使用数据注释属性（如[Required]），而ABP留档通常遵循流畅映射API方法。这取决于你。

                                    ABP有一些基本实体类和约定（请参阅实体文档），它提供了一些有用的扩展方法来配置从基本实体类继承的属性。

                                    ①、ConfigureByConvention方法

                                            ConfigureByConvention()是为实体配置所有基本属性和约定的主要扩展方法。

                                            因此，在Fluent API 的映射代码中为所有实体调用此方法是最佳实践。

                                            eg:  假设你有一个Book实体派生自AggregateRoot<Guid>基类：

                                                    public class Book : AuditedAggregateRoot<Guid>
                                                    {
                                                        public string Name { get; set; }
                                                    }

                                            你可以覆盖DbContext中的OnModelCreating方法并配置映射，如下所示：

                                                    protected override void OnModelCreating(ModelBuilder builder)
                                                    {
                                                        //  一定记得要调用基类的OnModelCreating方法，否则你将丢失ABP的默认配置。
                                                        base.OnModelCreating(builder);

                                                        builder.Entity<Book>(b =>
                                                        {
                                                            b.ToTable("Books");

                                                            // 按照约定配置基本属性，必须这样做，才能实现AuditedAggregateRoot基类的属性配置。
                                                            b.ConfigureByConvention();

                                                            // 配置特定于Book的属性
                                                            b.Property(x => x.Name).IsRequired().HasMaxLength(128);
                                                        });
                                                    }

                                                    这里调用b.ConfigureByConvention()对于正确配置基本属性很重要。
                                                
                                                    你可以在此处配置Name属性，也可以使用数据注释特性（请参阅EF Core文档）。

                                            虽然有许多扩展方法可以配置你的基本属性，但ConfigureByConvention()在必要时在内部调用它们。所以，调用它就足够了

                        
                         3、设置连接字符串

                                   如果你的应用程序中有"多个数据库"， 则可以使用[ConnectionStringName]属性为DbContext配置连接字符串名称。

                                   例如：
                                            [ConnectionStringName("MySecondConnString")]
                                            public class MyDbContext : AbpDbContext<MyDbContext>
                                            {

                                            }

                                    如果不配置，则使用Default连接字符串。

                                    如果你配置了特定的连接字符串名称，但未在应用程序配置中定义此连接字符串名称，则它会回退到Default连接字符串（有关详细信息，请参阅连接字符串文档）。


                        4、ABP数据库上下文选项类  AbpDbContextOptions

                                    AbpDbContextOptions用于配置DbContext选项。

                                    当你使用ABP的应用程序启动模板创建新解决方案时，你将看到一个简单的配置（在EntityFrameworkCore集成项目的模块类中），
                                    
                                    如下所示：

                                            Configure<AbpDbContextOptions>(options =>
                                            {
                                                options.UseSqlServer();
                                            });

                                    该配置将应用程序的所有DbContext的默认DBMS配置为SQL服务器。

                                    该配置是一个简写方式，可以使用以下代码块完成：

                                            Configure<AbpDbContextOptions>(options =>
                                            {
                                                options.Configure(opts =>
                                                {
                                                    opts.UseSqlServer();
                                                });
                                            });

                                    options.Configure(...)方法可以配置更多的选项。 如，你可以设置DbContextOptions（EF Core的本机选项），如下所示：
                                    
                                            Configure<AbpDbContextOptions>(options =>
                                            {
                                                options.Configure(opts =>
                                                {
                                                    opts.DbContextOptions.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
                                                });
                                            });


                                    为DbContext的ConfigureConventions和OnModelCreating方法添加操作，如下所示：

                                            options.DefaultConventionAction = (dbContext, builder) =>
                                            {
                                                // This action is called for ConfigureConventions method of all DbContexts.
                                            };

                                            options.ConfigureConventions<YourDbContext>((dbContext, builder) =>
                                            {
                                                // This action is called for ConfigureConventions method of specific DbContext.
                                            });

                                            options.DefaultOnModelCreatingAction = (dbContext, builder) =>
                                            {
                                                // This action is called for OnModelCreating method of all DbContexts.
                                            };

                                            options.ConfigureOnModelCreating<YourDbContext>((dbContext, builder) =>
                                            {
                                                // This action is called for OnModelCreating method of specific DbContext.
                                            });


                                    如果你有一个DbContext或者你有多个DbContext，但想为所有人使用相同的DBMS和配置，你可以保持原样。

                                    但是，如果你需要配置不同的DBMS或为特定的DbContext自定义配置，你可以如下所示指定它：

                                            Configure<AbpDbContextOptions>(options =>
                                            {
                                                // 所有 DbContext 的木人配置
                                                options.Configure(opts =>
                                                {
                                                    opts.UseSqlServer();
                                                });

                                                // 针对特定 DbContext 的自定义设置
                                                options.Configure<MyOtherDbContext>(opts =>
                                                {
                                                    opts.UseMySQL();
                                                });
                                            });

                                    请参阅切换到另一个DBMS for Entity Framework Core文档以了解如何配置DBMS。
                                    
                */

        </script>
    </body>
</html>